#include "app_common.h"
#include <sys/time.h>
#include <stdio.h>  
#include <stdlib.h>
#include <string.h>

long app_common_getCurrentTime()
{
    struct timeval tv;
    
    // 获取当前时间
    gettimeofday(&tv, NULL);
    long time = tv.tv_sec * 1000 + tv.tv_usec / 1000;
    // printf("current time: %ld\n", time);


    return time;
}


/**
 * @brief 将字符数组转换为16进制字符串      {'a', 'b'} => "6162"
 * 
 * @param chars 字符数组
 * @param chars_len 字符数组长度
 * @return char* 16进制字符串
 */             
char *app_common_charsToHexstr(char *chars, int chars_len)
{
    // 申请16进制字符串缓冲区
    char *hexstr = malloc(chars_len * 2 + 1);
    // 转换 字符数组 => 16进制字符串 
    for (int i = 0; i < chars_len; i++)
    {
        sprintf(hexstr + i * 2, "%02x", chars[i]);
    }
    // 16进制字符串末尾添加'\0'
    hexstr[chars_len * 2] = '\0';

    // 返回16进制字符串
    return hexstr;
}


/**
 * @brief 将16进制字符串转换为字符数组      "6162" => {'a', 'b'}
 * 
 * @param hexstr 16进制字符串
 * @param chars_len 字符数组长度
 * @return char* 字符数组
 */
char *app_common_hexstrToChars(char *hexstr, int *chars_len)
{
    // 计算字符数组长度
    int hexstr_len = strlen(hexstr);
    *chars_len = hexstr_len / 2;
    // 申请字符数组缓冲区
    char *chars = malloc(*chars_len);
    // 转换 16进制字符串 => 字符数组  (注意：这里的%02x是指从hexstr中取出2个字符，转换为16进制的整数)
    for (int i = 0; i < hexstr_len; i+=2)
    {
        sscanf(hexstr + i, "%2X", (unsigned int *)(chars + i/2));
    }

    // 返回字符数组
    return chars;

}